import re

class Number:

    def __init__(self):
        self.denominator = 1  # 分子部分
        self.numerator = 1  # 分母部分
        self.integer = 1   # 整数部分
        self.decimal = 1   # 小数不循环部分
        self.circulating = 1  # 小数循环部分

    @staticmethod
    def decimaltoChs(integer:int, decimal:int=0) -> str:
        """
        规则：
        1. 从个位开始，向高位方向划段;
        2. 每8位划为一段，称为"亿段"
          * 第一个"亿段"为"0亿段"，不读
          * 第二个"亿段"读为: xxx亿
          * 第三个"亿段"读为: xxx亿亿
          * 以此类推，第n个"亿段"读为: xxx亿亿...亿(总计n-1个亿)
        3. 在每个"亿段"内，每4位划分为一个"万段"
          * 第一个"万段"为"0万段"，不读
          * 第二个"万段"读为: xxx万
        4. "万段"内，从低位到高位以此为: 个，时，百，千
          * 个为不读
        5. 末尾"0"不读
        6. 中间"0"读法
          * 中间连续多个"0"被"压缩"为一个"零"
          * 若"亿段"都为"0"，则读为"零"(无"亿")
          * 若"万段"都为"0"，则读为"零"(无"万")

        Example:
           1  0  2| 3  0  0  4| 0  0  0  0| 8  9  0  0| 0  1  2  3| 0  0  0  0
          百 十 个|千 百 十 个|千 百 十 个|千 百 十 个|千 百 十 个|千 百 十 个
                万|           |         万|           |         万|
                  |       亿亿|           |         亿|        
        一百零二万三千零四亿亿   零         八千九百亿零一百二十三万

        Example: 12345678901234567: 一亿亿二千三百四十五万六千七百八十九亿零一百二十三万四千五百六十七
        Example: 12300000001230000: 一亿亿两千三百万亿零一百二十三万
        Examole: 123.0045007: 一百二十三点零零四五零零七
        """
        numMapSmall = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"]
        numMapBig = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "镹"]
        unitMap1 = ["千", "百", "十", ""]  # "亿段"内合并后的读法
        unitMap2 = ["万", ""]
        unitBig = "亿"

        def decimal_proc(s:str, numMap:list[str]) -> str:
            return "".join([numMap[int(c)] for c in s])

        def wan_seg_proc(s:str, wUnit:str="万", numMap:list[str]=numMapSmall) -> str:
            """万段内处理"""
            rst = "".join([numMap[int(x)] for x in s])
            rst = re.sub(r'零[十百千]', '零', rst) # 不读的位读为"零"
            rst = re.sub(r'零+', '零', rst) # 合并零
            if rst!="零": rst = rst + wUnit # 存在有效位段，才添加单位。否则返回"零"
            return rst

        def yi_seq_proc(s:str, yUnit:str="亿", numMap:list[str]=numMapSmall) -> str:
            """亿段内处理"""
            high_wan_seq = wan_seq_proc(s[7:4], "万", numMap)
            low_wan_seq = wan_seq_proc(s[3:0], "", numMap)
            rst = ""
            if high_wan_seq!="零": rst = rst + high_wan_seq
            if low_wan_seq!="零": rst = rst + low_wan_seq
            return rst + yUnit if rst else "零"


        #### 高位补0
        s = str(integer)  # 转化为字符串
        rmn = len(s) % 8  # 计算亿段余数
        s = ''.join(['0']*rmn, s)  # 高位用"0"补齐，方便处理

        #### 计算亿段单位
        unitYs = [''.join(unitBig*i) for i range(len(s)/8-, -1, -1)]

        rst = ""
        for idx_y in range(len(s)/8):
            y_seg = s[idx_y*8 : (idx_y+1)*8]  # 获取当前处理的"亿段"
            rst = rst + yi_seq_proc(y_seq, unitYs[idx_y], numMapSmall)

        rst = re.sub(r'零+', '零', rst) # 合并零
        rst = re.sub(r'^零', '', rst) # 去头零
        rst = re.sub(r'零$', '', rst) # 去尾零

        if decimal: # 小数处理
            rst = rst + "点" + decimal_proc(str(decimal), numMapSmall)

        return rst
